/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package imagemBmp;

import geradorImagens.Pixel;
import java.util.ArrayList;
import utilitarios.Conversoes;

/**
 *
 * @author jeferson
 */
public class FormatoBmp {

    //cabeçalho de 14 bytes
    public byte[] BfType;          // assinatura do arquivo
    public byte[] BfSize;          // tamanho do arquivo
    public byte[] BfReser1;        // campo reservado
    public byte[] BfReser2;        // campo reservado
    public byte[] BfOffSetBits;    // deslocamento
    //cabeçalho de 40 bytes
    public byte[] BiSize;          // tamanho do cabecalho
    public byte[] BiWidth;         //largura da imagem
    public byte[] BiHeight;        // altura da imagem
    public byte[] BiPlanes;        // numero de planos
    public byte[] BiBitCount;      // quantidade bits por pixel
    public byte[] BiCompress;      // compressao
    public byte[] BiSizeImag;      // tamanho da imagem
    public byte[] BiXPPMeter;      // resolucao horizontal
    public byte[] BiYPPMeter;      // resolucao vertical
    public byte[] BiClrUsed;       // numero de cores usada na imagem
    public byte[] BiClrImpor;      // numero de cores importantes
    //palheta de cores yuv e normal
    public Pixel[] paleta;         //paleta de cores pode ir até 256 com 4 bytes cada posição
    //bytes da imagem
    public byte[] imagem;

    public FormatoBmp() {
        BfType = new byte[2];       // 0-1
        BfSize = new byte[4];       // 2 - 5
        BfReser1 = new byte[2];     // 6 - 7
        BfReser2 = new byte[2];     // 8 - 9
        BfOffSetBits = new byte[4]; // 10 - 13
        BiSize = new byte[4];       // 14 - 17
        BiWidth = new byte[4];      // 18 - 21
        BiHeight = new byte[4];     // 22 - 25
        BiPlanes = new byte[2];     // 26 - 27
        BiBitCount = new byte[2];   // 28 - 29
        BiCompress = new byte[4];   // 30 - 33
        BiSizeImag = new byte[4];   // 34 - 37
        BiXPPMeter = new byte[4];   // 38 - 41
        BiYPPMeter = new byte[4];   // 42 - 45
        BiClrUsed = new byte[4];    // 46 - 49
        BiClrImpor = new byte[4];   // 50 - 53
    }

    public int getBiHeight() {
        return Conversoes.byteArray2Int4(BiHeight);
    }

    public int getBiWidth() {
        return Conversoes.byteArray2Int4(BiWidth);
    }

    public int getBiBitCount() {
        return Conversoes.byteArray2Int2(BiBitCount);
    }

    public int getBfSize() {
        return Conversoes.byteArray2Int4(BfSize);
    }

    public void setBfOffSetBits(byte novo) {
    }

    public FormatoBmp converterCinza8Bit(FormatoBmp bmp) {


        System.out.println("bmp ima tamanho = " + bmp.imagem.length);
        for (int i = 0; i < bmp.imagem.length; i += 3) {
//            System.out.println("for");
            int B = (bmp.imagem[i] & 0xFF);
            int G = (bmp.imagem[i + 1] & 0xFF);
            int R = (bmp.imagem[i + 2] & 0xFF);


            int C = (int) (0.299 * R + 0.58 * G + 0.114 * B);
            bmp.imagem[i] = (byte) C;
            bmp.imagem[i + 1] = (byte) C;
            bmp.imagem[i + 2] = (byte) C;
        }
        bmp.BiBitCount = Conversoes.toBytes(8);
        bmp.imagem =converte2Paleta(bmp);
        bmp.paleta = this.paleta;
        return bmp;
    }

    public byte[] converterCinza24Bit(FormatoBmp bmp) {


        for (int i = 0; i < bmp.imagem.length; i += 3) {
//            System.out.println("for");
            int B = (bmp.imagem[i] & 0xFF);
            int G = (bmp.imagem[i + 1] & 0xFF);
            int R = (bmp.imagem[i + 2] & 0xFF);


            int C = (int) (0.299 * R + 0.58 * G + 0.114 * B);
            bmp.imagem[i] = (byte) C;
            bmp.imagem[i + 1] = (byte) C;
            bmp.imagem[i + 2] = (byte) C;
        }


        return bmp.imagem;
    }

    private byte [] converte2Paleta(FormatoBmp bmp) {

        byte[] C1 = new byte[256];
        byte[] C2 = new byte[256];
        byte[] C3 = new byte[256];
        int contC = 0;
        byte[] indice = new byte[bmp.imagem.length];
        int cont = 0;
        for (int i = 0; i < bmp.imagem.length; i+=3) {
            if (i == 0) {
                C1[contC] = bmp.imagem[i];
                C2[contC] = bmp.imagem[i + 1];
                C3[contC] = bmp.imagem[i + 2];
                contC++;
                indice[cont] = (byte) contC;
                cont++;
            }

            if (C1[contC] == bmp.imagem[i]) {
                if (C2[contC] == bmp.imagem[i + 1]) {
                    if (C3[contC] == bmp.imagem[i + 2]) {
                        indice[cont] = (byte) contC;
                        cont++;
                    }
                }
            }
        }
        cont = 0;
        this.paleta = new Pixel [C1.length+C2.length+C3.length];
        Pixel auxPixel;
        for(int i = 0;i<256;i++){
           auxPixel = new Pixel(C1[cont],C2[cont],C3[cont],0);
           this.paleta[i] = auxPixel;
           
            cont++;
        }
        return indice;
    }
}
